package cn.kow.kmall.controller;

import cn.kow.kmall.common.enums.ContentModuleTypeEnum;
import cn.kow.kmall.core.response.KmallResult;
import cn.kow.kmall.pojo.dto.ContentModuleDTO;
import cn.kow.kmall.pojo.dto.ContentModuleItemDTO;
import cn.kow.kmall.pojo.dto.ItemListDTO;
import cn.kow.kmall.pojo.dto.ItemQueryDTO;
import cn.kow.kmall.pojo.vo.ContentModuleVO;
import cn.kow.kmall.service.ContentService;
import cn.kow.kmall.service.ItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author: lijun
 * @Description:
 * @Date: Created in 2020-03-05 13:55
 * @Modified By:
 */
@Slf4j
@RestController
public class ContentController {

    @Autowired
    private ContentService contentService;

    @Autowired
    private ItemService itemService;

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/index")
    public KmallResult index() {
        // 获取首页模块
        List<ContentModuleDTO> moduleList = contentService.listModuleInfo();

        // Banner
        ContentModuleDTO bannerModule = moduleList.stream()
                .filter(m -> ContentModuleTypeEnum.BANNER.getType().equals(m.getModuleType())).findFirst().orElse(null);


        // 金刚位
        ContentModuleDTO kingkongModule = moduleList.stream()
                .filter(m -> ContentModuleTypeEnum.KINGKONG.getType().equals(m.getModuleType())).findFirst().orElse(null);

        Set<Long> itemIds = new HashSet<>();
        for (ContentModuleDTO module : moduleList) {
            List<ContentModuleItemDTO> itemDTOList = module.getItemList();
            if (!CollectionUtils.isEmpty(itemDTOList)) {
                itemIds.addAll(itemDTOList.stream().map(a -> a.getItemId()).collect(Collectors.toList()));
            }
        }
        ItemQueryDTO queryDTO = new ItemQueryDTO();
        queryDTO.setItemIds(new ArrayList<>(itemIds));
        queryDTO.setPage(0);
        queryDTO.setSize(itemIds.size());
        List<ItemListDTO> itemList = itemService.queryItemList(queryDTO);
        Map<Long, ItemListDTO> itemMap = itemList.stream().collect(Collectors.toMap(ItemListDTO::getItemId, i -> i));
        List<ContentModuleVO> moduleVOList = new ArrayList<>();
        for (ContentModuleDTO module : moduleList) {
            int type = module.getModuleType();
            if (ContentModuleTypeEnum.BANNER.getType() == type || ContentModuleTypeEnum.KINGKONG.getType() == type) {
                continue;
            }
            ContentModuleVO moduleVO = new ContentModuleVO();
            List<ContentModuleItemDTO> itemDTOList = module.getItemList();
            BeanUtils.copyProperties(module, moduleVO);
            if (!CollectionUtils.isEmpty(itemDTOList)) {
                List<ItemListDTO> items = itemDTOList.stream().map(i -> itemMap.get(i.getItemId())).collect(Collectors.toList());
                moduleVO.setItemList(items);
            }
            moduleVOList.add(moduleVO);
        }

        String policyKey = "policy";
        List<String> policyList = (List<String>) redisTemplate.opsForValue().get(policyKey);
        return KmallResult.success()
                .put("bannerList", bannerModule.getImageList())
                .put("kingkongList", kingkongModule != null ? kingkongModule.getKingkongList() : null)
                .put("policyList", policyList)
                .put("moduleList", moduleVOList);
    }
}
